home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
326-350
/
disk_349
/
med
/
source
/
medplayer200src.zoo
/
medplayer.c
< prev
Wrap
C/C++ Source or Header
|
1990-04-03
|
5KB
|
198 lines
/* ---------------------------------------- */
/* MEDPlayer.c V2.00 by Teijo Kinnunen 1990 */
/* ---------------------------------------- */
#include <workbench/startup.h>
#include <workbench/icon.h>
#include <workbench/workbench.h>
#include "med.h"
struct Kappale far tamakappale;
struct SoundTrackerKappale far ladattu;
UWORD lohkoja = 0,chip zeroptr = 0;
struct Window *window = NULL;
struct Lohko *blocks[100];
struct Soitin *samples[33];
struct ObjSong song;
extern struct CIA far ciaa;
extern struct WBStartup *WBenchMsg;
void FreeAllBlocks(),VapautaSoittimet(),Ilmoita();
struct Library *IconBase = NULL;
BOOL clistartup = FALSE,LoadSong();
BPTR outputfh;
static char defaulttitle[] = "MEDPlayer V2.00 by Teijo Kinnunen, 1990";
void MakeObjSong()
{
UBYTE scnt = 0;
for(scnt = 0; scnt < 32; scnt++) {
song.vol[scnt] = tamakappale.soittimenvoimakkuus[scnt];
song.rep[scnt] = tamakappale.stoisto[scnt];
song.replen[scnt] = tamakappale.stoistonpit[scnt];
song.midichan[scnt] = tamakappale.midikanava[scnt];
song.midipres[scnt] = tamakappale.midipreset[scnt];
}
song.blocks = lohkoja;
memcpy(song.playseq,tamakappale.soittojarjestys,100);
song.songlen = tamakappale.kappaleen_pituus;
song.playtransp = tamakappale.playtransp;
song.flags = tamakappale.liput;
song.slide = tamakappale.vaihtoja;
}
void Play()
{
struct Message *imsg;
MakeObjSong();
if(InitPlayer()) return;
SetTempo(tamakappale.tempo);
StartPlayer();
if(clistartup) {
Write(outputfh,"Press Ctrl-C to quit\n",21);
Wait(SIGBREAKF_CTRL_C);
} else {
Ilmoita(defaulttitle);
WaitPort(window->UserPort);
imsg = GetMsg(window->UserPort);
ReplyMsg(imsg);
}
StopPlayer();
}
void PrintUsage()
{
Write(outputfh,"MEDPlayer usage:\n",17);
Write(outputfh," MEDPlayer song [pathfile]\n",28);
}
BOOL CLIStartup(char *cmdline)
{
char *argv[3],argc = 0,quote = 0;
outputfh = Output();
clistartup = TRUE;
Write(outputfh,"MEDPlayer V2.00 by Teijo Kinnunen, 1990\n",40);
for(;;) { /* The command line parser */
if(*cmdline == '\"') {
if((quote = (!quote)) == FALSE) *cmdline = '\0';
}
else if((*cmdline == '\t'||*cmdline == ' ') && !quote) {
*cmdline = '\0';
if(++argc >= 3) break;
while(*(++cmdline) == ' ' || *cmdline == '\t');
argv[argc] = (*cmdline == '\"' ? cmdline+1 : cmdline);
continue;
}
else if(*cmdline == '\n' || *cmdline == '\0') {
*cmdline = '\0'; argc++; break; }
cmdline++;
}
if(argc < 2 || argc > 3 || *argv[1] == '?' || !(*argv[1])) {
PrintUsage();
return(TRUE);
}
LataaSoitinLista(argc == 3 ? argv[2] : NULL);
return(LoadSong(argv[1]));
}
BOOL WBenchStartup()
{
struct DiskObject *plr;
char *pathf;
struct WBArg *wbarg;
if(!(IconBase = OpenLibrary(ICONNAME,0))) return(TRUE);
if(WBenchMsg->sm_NumArgs < 2) return(TRUE);
wbarg = WBenchMsg->sm_ArgList;
CurrentDir(wbarg[1].wa_Lock);
if(!(plr = GetDiskObject(wbarg[1].wa_Name))) return(TRUE);
pathf = FindToolType(plr->do_ToolTypes,"PATHF");
LataaSoitinLista(pathf);
FreeDiskObject(plr);
return(LoadSong(wbarg[1].wa_Name));
}
static BOOL Window()
{
static struct NewWindow nw = {
230,10,400,10,2,1,CLOSEWINDOW,WINDOWDEPTH|WINDOWCLOSE|
WINDOWDRAG|SIMPLE_REFRESH|NOCAREREFRESH|RMBTRAP,
NULL,NULL,NULL,NULL,NULL,0,0,0,0,WBENCHSCREEN };
nw.Title = defaulttitle;
if(!(window = OpenWindow(&nw))) return(TRUE);
return(FALSE);
}
static void CloseDown()
{
ciaa.ciapra &= ~CIAF_LED;
if(clistartup) Write(outputfh,"\n",1);
RemPlayer();
FreeAllBlocks();
if(window) CloseWindow(window);
VapautaSoittimet();
VapautaSoitinLista();
if(IconBase) CloseLibrary(IconBase);
CloseLibrary(IntuitionBase);
}
void Ilmoita(char *text)
{
if(clistartup) {
Write(outputfh,text,strlen(text));
Write(outputfh," ",
50 - strlen(text));
Write(outputfh,"\x0d",1);
} else SetWindowTitles(window,text,(char *)-1);
}
void _main(char *cmdline)
{
if(!(IntuitionBase = OpenLibrary("intuition.library",0))) return;
if(!WBenchMsg) { if(!CLIStartup(cmdline)) Play(); }
else if(!Window()) if(!WBenchStartup()) Play();
CloseDown();
}
void FreeBlock(num)
UWORD num;
{
if(blocks[num]) {
FreeMem(blocks[num],4 + blocks[num]->numtracks * ONETRKSIZE);
blocks[num] = 0L;
}
}
BOOL AllocBlock(UWORD num,UBYTE tracks) /* TRUE = virhe, FALSE = ok!! */
{
if(blocks[num]) {
if(blocks[num]->numtracks == tracks) return(FALSE);
FreeBlock(num);
}
if(!(blocks[num] = AllocMem(4 + ONETRKSIZE * tracks,MEMF_PUBLIC|
MEMF_CLEAR))) return(TRUE);
blocks[num]->numtracks = tracks;
return(FALSE);
}
void FreeAllBlocks()
{
int cnt;
for(cnt = 0; cnt < 100; cnt++) FreeBlock(cnt);
}
void VapautaSoittimet()
{
UCOUNT slsk;
for(slsk = 1; slsk < 32; slsk++)
if(samples[slsk]) {
FreeMem((void *)samples[slsk],samples[slsk]->length + sizeof(struct Soitin));
samples[slsk] = NULL;
tamakappale.soitin[slsk][0] = '\0';
}
}
void Ilmoita2(char *txt1,char *txt2)
{
char info[100];
strcpy(info,txt1);
strcat(info,txt2);
Ilmoita(info);
}